package chen.yi.component.common.tree;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 形成树形结构
 * @author huat
 **/
public final class TreeUtils {
    /**
     * 默认方法：构建树形结构
     * @param nodes 所有节点列表
     * @return 构建好的树形结构根节点列表
     */
    public static <T extends TreeNode<T>> List<T> buildTree(List<T> nodes) {
        Map<Long, T> nodeMap = nodes.stream()
                .collect(Collectors.toMap(TreeNode::getId, node -> node));

        List<T> roots = new ArrayList<>();
        nodes.forEach(node -> {
            Long parentId = node.getParentId();
            if (parentId == null || parentId == 0) {
                roots.add(node);
            } else {
                T parent = nodeMap.get(parentId);
                if (parent != null) {
                    if (parent.getChildren() == null) {
                        parent.setChildren(new ArrayList<>());
                    }
                    parent.getChildren().add(node);
                }
            }
        });
        return roots;
    }
}
